<!--
 * @file 页面生命周期监听组件
 * @description 用于处理页面生命周期和路由变化
 * @date 2024-06-28
 -->
<template>
  <!-- 无渲染组件 -->
</template>

<script setup lang="ts">
// @ts-ignore - uni-app环境下Vue导入需要忽略类型检查
import { ref, onMounted, onUnmounted } from 'vue';
import { getCurrentPages } from '@dcloudio/uni-h5';
import { logger } from '@/utils/system/logger';

// Props定义
const props = defineProps({
  /** 是否启用路由监听 */
  enableRouteMonitor: {
    type: Boolean,
    default: true
  }
});

// Emits定义
const emit = defineEmits([
  'route-change',  // 路由变化事件
  'page-load',     // 页面加载事件
  'page-show',     // 页面显示事件
  'page-hide',     // 页面隐藏事件
  'page-ready',    // 页面就绪事件
  'page-unload'    // 页面卸载事件
]);

// 当前路由信息
const currentRoute = ref('');
const currentPage = ref<any>(null);

/**
 * 更新当前路由信息
 */
function updateCurrentRoute(): void {
  const pages = getCurrentPages();
  if (pages.length > 0) {
    const page = pages[pages.length - 1];
    const route = '/' + page.route;
    
    // 如果路由发生变化，触发事件
    if (currentRoute.value !== route) {
      currentRoute.value = route;
      currentPage.value = page;
      
      // 触发路由变化事件
      emit('route-change', {
        route,
        page,
        params: page.options || {}
      });
      
      logger.info('路由变化:', route);
    }
  }
}

/**
 * 设置页面生命周期监听
 */
function setupPageLifecycle(): () => void {
  // 创建一个拦截器配置对象，处理所有生命周期事件
  const lifecycleInterceptor = {
    invoke(args: any, eventName: string) {
      logger.info(`页面 ${eventName}`);
      
      // 仅在路由可能变化的钩子中更新路由信息
      if (eventName === 'onLoad' || eventName === 'onShow') {
        updateCurrentRoute();
      }
      
      // 触发对应的生命周期事件
      switch (eventName) {
        case 'onLoad':
          emit('page-load', args);
          break;
        case 'onShow':
          emit('page-show');
          break;
        case 'onReady':
          emit('page-ready');
          break;
        case 'onHide':
          emit('page-hide');
          break;
        case 'onUnload':
          emit('page-unload');
          break;
      }
      
      return args;
    }
  };
  
  // 需要监听的生命周期钩子列表
  const lifecycleHooks = ['onLoad', 'onShow', 'onReady', 'onHide', 'onUnload'];
  
  // 批量注册拦截器
  lifecycleHooks.forEach(hook => {
    // @ts-ignore - uni-app的类型定义不完整
    uni.addInterceptor(hook, {
      invoke(args: any) {
        return lifecycleInterceptor.invoke(args, hook);
      }
    });
  });
  
  // 返回清理函数
  return () => {
    lifecycleHooks.forEach(hook => {
      // @ts-ignore
      uni.removeInterceptor(hook);
    });
  };
}

// 组件挂载时设置生命周期监听
let cleanup: (() => void) | null = null;

onMounted(() => {
  if (props.enableRouteMonitor) {
    cleanup = setupPageLifecycle();
    // 初始化当前路由
    updateCurrentRoute();
  }
});

// 组件卸载时清理
onUnmounted(() => {
  if (cleanup) {
    cleanup();
    cleanup = null;
  }
});

// 对外暴露方法和属性
defineExpose({
  currentRoute,
  currentPage,
  updateCurrentRoute
});
</script> 